#!/usr/bin/env node

/**
 * 部署时自动重新验证脚本
 * 使用方法: node scripts/deploy-revalidate.js
 * 
 * 这个脚本应该在部署流程中调用，用于在项目发布后立即重新验证所有页面
 */

const BASE_URL = process.env.NEXT_PUBLIC_BASE_URL || 'https://your-domain.com';
const TOKEN = process.env.REVALIDATE_TOKEN || 'your-secret-token';

// 需要重新验证的页面路径
const PAGES_TO_REVALIDATE = [
  '/',           // 首页
  '/about',      // 关于页面
  '/user/1',     // 用户详情页面示例
  '/realtime',   // 实时数据页面
  '/admin'       // 管理页面
];

// 需要重新验证的缓存标签
const TAGS_TO_REVALIDATE = [
  'products',    // 商品相关
  'articles',    // 文章相关
  'users',       // 用户相关
  'config'       // 配置相关
];

// 重新验证单个页面
async function revalidatePage(path) {
  console.log(`🔄 重新验证页面: ${path}`);
  
  try {
    const response = await fetch(`${BASE_URL}/api/revalidate`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'x-revalidate-token': TOKEN
      },
      body: JSON.stringify({ path })
    });

    const data = await response.json();
    
    if (data.success) {
      console.log(`✅ 页面重新验证成功: ${path}`);
      return { success: true, path, timestamp: data.timestamp };
    } else {
      console.log(`❌ 页面重新验证失败: ${path} - ${data.error}`);
      return { success: false, path, error: data.error };
    }
  } catch (error) {
    console.error(`❌ 请求失败: ${path} - ${error.message}`);
    return { success: false, path, error: error.message };
  }
}

// 重新验证缓存标签
async function revalidateTag(tag) {
  console.log(`🔄 重新验证标签: ${tag}`);
  
  try {
    const response = await fetch(`${BASE_URL}/api/revalidate`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'x-revalidate-token': TOKEN
      },
      body: JSON.stringify({ tag })
    });

    const data = await response.json();
    
    if (data.success) {
      console.log(`✅ 标签重新验证成功: ${tag}`);
      return { success: true, tag, timestamp: data.timestamp };
    } else {
      console.log(`❌ 标签重新验证失败: ${tag} - ${data.error}`);
      return { success: false, tag, error: data.error };
    }
  } catch (error) {
    console.error(`❌ 请求失败: ${tag} - ${error.message}`);
    return { success: false, tag, error: error.message };
  }
}

// 检查部署环境
function checkDeploymentEnvironment() {
  const env = process.env.NODE_ENV || 'development';
  const isProduction = env === 'production';
  
  console.log(`🌍 部署环境: ${env}`);
  console.log(`🎯 目标URL: ${BASE_URL}`);
  
  if (!isProduction) {
    console.log('⚠️  警告: 当前不是生产环境，请确认是否继续');
  }
  
  return { env, isProduction };
}

// 主部署重新验证函数
async function deployRevalidate() {
  console.log('🚀 开始部署后重新验证');
  console.log('=' .repeat(50));
  
  // 检查环境
  const { env, isProduction } = checkDeploymentEnvironment();
  
  // 检查必要配置
  if (!TOKEN || TOKEN === 'your-secret-token') {
    console.error('❌ 错误: 未设置 REVALIDATE_TOKEN 环境变量');
    process.exit(1);
  }
  
  if (BASE_URL === 'https://your-domain.com') {
    console.error('❌ 错误: 未设置 NEXT_PUBLIC_BASE_URL 环境变量');
    process.exit(1);
  }
  
  console.log('');
  
  const results = {
    pages: [],
    tags: [],
    summary: {
      totalPages: PAGES_TO_REVALIDATE.length,
      totalTags: TAGS_TO_REVALIDATE.length,
      successfulPages: 0,
      successfulTags: 0,
      failedPages: 0,
      failedTags: 0
    }
  };
  
  // 重新验证页面
  console.log('📄 重新验证页面...');
  for (const path of PAGES_TO_REVALIDATE) {
    const result = await revalidatePage(path);
    results.pages.push(result);
    
    if (result.success) {
      results.summary.successfulPages++;
    } else {
      results.summary.failedPages++;
    }
    
    // 添加延迟避免过于频繁的请求
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
  
  console.log('');
  
  // 重新验证标签
  console.log('🏷️  重新验证缓存标签...');
  for (const tag of TAGS_TO_REVALIDATE) {
    const result = await revalidateTag(tag);
    results.tags.push(result);
    
    if (result.success) {
      results.summary.successfulTags++;
    } else {
      results.summary.failedTags++;
    }
    
    // 添加延迟
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
  
  // 输出结果摘要
  console.log('');
  console.log('📊 重新验证结果摘要');
  console.log('=' .repeat(30));
  console.log(`页面重新验证: ${results.summary.successfulPages}/${results.summary.totalPages} 成功`);
  console.log(`标签重新验证: ${results.summary.successfulTags}/${results.summary.totalTags} 成功`);
  console.log(`总成功率: ${((results.summary.successfulPages + results.summary.successfulTags) / (results.summary.totalPages + results.summary.totalTags) * 100).toFixed(1)}%`);
  
  // 输出失败的项
  const failedPages = results.pages.filter(r => !r.success);
  const failedTags = results.tags.filter(r => !r.success);
  
  if (failedPages.length > 0) {
    console.log('');
    console.log('❌ 失败的页面:');
    failedPages.forEach(page => {
      console.log(`  - ${page.path}: ${page.error}`);
    });
  }
  
  if (failedTags.length > 0) {
    console.log('');
    console.log('❌ 失败的标签:');
    failedTags.forEach(tag => {
      console.log(`  - ${tag.tag}: ${tag.error}`);
    });
  }
  
  console.log('');
  console.log('🎉 部署重新验证完成！');
  
  // 如果有失败的项目，返回非零退出码
  if (failedPages.length > 0 || failedTags.length > 0) {
    console.log('⚠️  部分重新验证失败，请检查日志');
    process.exit(1);
  }
  
  return results;
}

// 如果直接运行此脚本
if (require.main === module) {
  deployRevalidate().catch(error => {
    console.error('❌ 部署重新验证失败:', error);
    process.exit(1);
  });
}

module.exports = {
  deployRevalidate,
  revalidatePage,
  revalidateTag
};
